#ifndef STATE_H
#define STATE_H

#include <set>
#include <vector>
#include <string>
#include "types.h"

using namespace std;

#define EPSILON '\0' // 空 (null) 字符

std::string show_convert(const char& con) {
    if (con==EPSILON) { // 更清晰地表达意图
        return "ξ"; // 使用Xi表示空集，但如果是空转移通常用epsilon符号
    }else{
        return (string{""}+con);
    }

   
}


std::string show_state(const std::set<int>& con){
    assert(con.size()!=0);
    std::string res;
    for (auto &it : con) {
        res=res+" "+to_string(it);
    }
    return res;
}
using namespace std;

// 定义一个转换结构体来表示状态转换
struct Transition {
public:
    char input_char=EPSILON; // 可触发转换的字符集合
    int next_state; // 转换可以到达的状态ID集合
    Transition(){}
    Transition(char ic,int ns):input_char(move(ic)),next_state(ns){
    }

    void get_info() const{
        cout << "On input '" << show_convert(input_char) << "'-> " << next_state<<endl;
    }
};

class StateNode {
public:
    int state_id=-1;
    StateType type=StateType::UNMATCH;
    // LexemeCategory category;
    vector<Transition> transitions; // 状态转换列表
    // map<set<char>, set<int>> transitions;

    StateNode(){
    }

    StateNode(int st_id , StateType tp=StateType::UNMATCH):state_id(st_id),type(tp){};
    

};

#endif